#ifndef TABLEDELEGATE_H
#define TABLEDELEGATE_H

#include <QStyledItemDelegate>

/**
 * @class CTableDelegate
 * 
 * 这是一个定制的表格代理类，继承自QStyledItemDelegate，用于处理表格视图中的项目绘制和编辑行为。
 */
class CTableDelegate : public QStyledItemDelegate
{
public:
    /**
     * 构造函数
     * 
     * @param parent 父对象，默认为nullptr
     */
    CTableDelegate(QObject *parent = nullptr);

    // QAbstractItemDelegate interface
public:
    /**
     * 创建用于编辑项的控件
     * 
     * @param parent 父控件
     * @param option 视图项的样式选项
     * @param index 视图项的索引
     * @return 返回创建的编辑器控件指针
     */
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;

    /**
     * 将模型数据设置到编辑器中
     * 
     * @param editor 编辑器控件
     * @param index 视图项的索引
     */
    void setEditorData(QWidget *editor, const QModelIndex &index) const;

    /**
     * 从编辑器获取数据并设置到模型中
     * 
     * @param editor 编辑器控件
     * @param model 模型
     * @param index 视图项的索引
     */
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;

    /**
     * 调整编辑器的几何形状
     * 
     * @param editor 编辑器控件
     * @param option 视图项的样式选项
     * @param index 视图项的索引
     */
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;

    /**
     * 处理编辑事件
     * 
     * @param event 事件
     * @param model 模型
     * @param option 视图项的样式选项
     * @param index 视图项的索引
     * @return 返回一个布尔值，指示是否处理了事件
     */
    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

private:
    /**
     * 检查给定索引的项是否有值描述
     * 
     * @param index 视图项的索引
     * @param valuesDesMap 值描述的映射
     * @return 返回一个布尔值，表示是否有值描述
     */
    bool hasValusDes(const QModelIndex &index,QMap<int,QString>& valuesDesMap) const;

private:
    int m_editableRectWidth = 5;
    int m_editableRectHeight = 5;
};

#endif // TABLEDELEGATE_H
